/*
 * mainWindow主进程类，也是显示进程的主类，因界面逻辑并不复杂，所有界面元素均通过代码或ui designer设计在
 * mainWindow里，
 *
 * FIELD:
 *     ui:
 *         1. tag(Action*)
 *         2. event(Action*)
 *         3. setting(Action*)
 *
 *     tableViewModel:
 *         1. tagModel(QSqlTableModel*)   用于显示测点列表，同时用于配置，设置QT::OnFieldChange
 *         2. eventModel(QSqlTableModel*)   用于显示报警事件列表
 *
 *     database connection:
 *         1. globalSqliteConnection(QSqlDatabase)    用于界面(主进程)连接数据库
 *
 *     thread:
 *         1. scanThread(QThread)    用于生成子进程
 *         2. scanner(ExchangeScanner*)    子进程内部执行类，在mainWindow生成通过moveToThread()移植进入子进程
 *
 * MEMBER FUNCTIONS:
 *     备注：主界面成员函数均为ui逻辑点击显示，点击切换page函数，无特殊逻辑，不写在类注释里了
*/

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include "exchangescanner.h"

#include <QMainWindow>
#include <QSqlTableModel>
#include <QTableView>
#include <QSqlDatabase>
#include <QThread>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    //构造函数
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();


private slots:

    //点击测点列表的操作
    void showMeTheTag();
    //点击报警事件操作
    void showMeTheEvent();
    //点击系统设置操作
    void showMeTheSetting();

private:
    Ui::MainWindow *ui;

    //menu的按钮，按钮是采用代码写进去的，因为在ui设计过程中，并未找到将QMenu改为QAction的方式
    QAction * tag = nullptr;
    QAction * event =nullptr;
    QAction * setting = nullptr;

    // 全局ui sqlite连接对象，mainwindow里并未设置与 sql server的交互连接，因为并不需要，与sql server的交互连接均发生在子进程里
    QSqlDatabase globalSqliteConnection;

    /*
     * 共有两个界面需要用表格view和model的方式显示，一个是tag界面的model和view
     * 一个是event界面，需要的是event的model和view
    */

    //用于tag显示的第一个model
    QSqlTableModel * tagModel;
    //用户event显示的第二个model
    QSqlTableModel * eventModel;
    //用户setting显示的第三个model，这个表是用户用来配置交换时间的表格
    QSqlTableModel * exchangeTagCycleModel;

    //创建扫描线程
    QThread scanThread;
    //创建扫描对象
    ExchangeScanner * scanner;
};
#endif // MAINWINDOW_H
